Hizmet ağı entegrasyonu ile Python API ağ geçidi geliştirmesini keşfedin. Küresel bağlamda mikro hizmetler, yönlendirme, kimlik doğrulama ve gözlemlenebilirlik hakkında bilgi edinin.
Python API Ağ Geçidi: Modern Mimariler İçin Hizmet Ağı Uygulaması
Günümüzün hızla gelişen dijital ortamında, mikro hizmetler mimarileri ölçeklenebilir, esnek ve bakımı kolay uygulamalar oluşturmak için norm haline geldi. Bu mimarilerin kalbinde, hizmetler arasında verimli ve güvenli iletişim ihtiyacı yatar. API Ağ Geçitleri ve Hizmet Ağları burada devreye giriyor. Bu makale, Python tabanlı bir API Ağ Geçidinin nasıl oluşturulacağını ve küresel bir bağlamda mikro hizmet iletişimini yönetmek için sağlam bir çözüm sağlayan bir hizmet ağıyla nasıl entegre edileceğini araştırıyor.
API Ağ Geçitlerini ve Hizmet Ağlarını Anlama
API Ağ Geçidi Nedir?
Bir API Ağ Geçidi, bir mikro hizmetler arka ucuna yönelik tüm istemci istekleri için tek bir giriş noktası görevi görür. Aşağıdaki gibi görevleri ele alır:
- Yönlendirme: İstekleri uygun mikro hizmete yönlendirme.
- Kimlik Doğrulama ve Yetkilendirme: İstemcinin kimliğini doğrulama ve gerekli izinlere sahip olduklarından emin olma.
- Hız Sınırlama: Kötüye kullanımı önleme ve hizmetlerin adil kullanımını sağlama.
- İstek Dönüşümü: İstekleri arka uca göndermeden önce değiştirme.
- Yanıt Toplama: Birden çok mikro hizmetten gelen yanıtları tek bir yanıtta birleştirme.
- Önbelleğe Alma: Gecikmeyi azaltma ve performansı artırma.
Uygulamanız için gelen tüm trafiği işleyen ve doğru yere güvenli ve verimli bir şekilde ulaşmasını sağlayan karmaşık bir resepsiyonist olarak düşünün. Örneğin, Avustralya'daki bir mobil uygulama API ağ geçidine bir istek gönderebilir ve bu da isteği Singapur'da bulunan bir fiyatlandırma hizmetine ve Almanya'daki bir envanter hizmetine yönlendirerek, kullanıcıya geri göndermeden önce sonuçları toplar.
Hizmet Ağı Nedir?
Bir hizmet ağı, bir mikro hizmetler mimarisi içinde hizmetten hizmete iletişimi ele alan bir altyapı katmanıdır. Aşağıdaki gibi özellikler sağlar:
- Hizmet Keşfi: Bir hizmetin mevcut örneklerini otomatik olarak bulma.
- Trafik Yönetimi: Yük dengeleme, yönlendirme ve devre kesme dahil olmak üzere hizmetler arasındaki trafik akışını kontrol etme.
- Gözlemlenebilirlik: Hizmetlerin performansı ve sağlığı hakkında bilgiler sağlama.
- Güvenlik: Hizmetler arasındaki iletişimi şifreleme ve güvenlik politikalarını uygulama.
Hizmet ağı tipik olarak bir kontrol düzleminden (örn. Istio) ve bir veri düzleminden (örn. Envoy) oluşur. Veri düzlemi, hizmetten hizmete tüm iletişimi engeller ve kontrol düzlemi tarafından tanımlanan politikaları uygular. Tüm dahili iletişimi ele alan, mesajların güvenli, güvenilir ve verimli bir şekilde teslim edilmesini sağlayan görünmez kuryelerden oluşan bir ağı hayal edin. Bir hizmet ağı, varsayılan olarak sıfır güven ağı sağlar - her hizmet, nerede bulunduklarına bakılmaksızın diğer her hizmeti doğrular. Bu, özellikle farklı coğrafi bölgelere yayılmış hizmetleri olan çok uluslu şirketlerde kritik öneme sahiptir.
Neden Bir API Ağ Geçidini ve Bir Hizmet Ağını Birleştirmelisiniz?
Hem API Ağ Geçitleri hem de Hizmet Ağları mikro hizmet iletişimini ele alırken, farklı katmanlarda çalışırlar ve farklı sorunları çözerler. Bir API Ağ Geçidi harici trafiği yönetmeye odaklanırken, bir Hizmet Ağı dahili trafiği yönetmeye odaklanır. İkisini birleştirmek, küme içinde ve dışında mikro hizmet iletişimini güvence altına almak, yönetmek ve gözlemlemek için kapsamlı bir çözüm sağlar.
Örneğin, bir e-ticaret platformunu düşünün. API Ağ Geçidi, web ve mobil uygulamalardan gelen istekleri işler, kullanıcıların kimliğini doğrular, hız sınırları uygular ve istekleri uygun arka uç hizmetlerine yönlendirir. Hizmet Ağı, arka uç hizmetleri arasındaki iletişimi yöneterek ürün kataloğu, sipariş yönetimi ve ödeme işleme hizmetleri arasında güvenli ve güvenilir iletişim sağlar. API Ağ Geçidi, Okta veya Auth0 gibi harici kimlik doğrulama hizmetlerini kullanabilirken, hizmet ağı, karşılıklı TLS (mTLS) kullanarak dahili hizmetler arasındaki güvenli iletişimi sağlar.
Python API Ağ Geçidi Oluşturma
Python, zengin kütüphane ve çerçeve ekosistemiyle API Ağ Geçitleri oluşturmak için mükemmel bir seçimdir. Ölçeklenebilir ve bakımı kolay bir ağ geçidi oluşturmak için çerçevelerin bir kombinasyonunu kullanacağız.
Çerçeve Seçimi
- FastAPI: API'ler oluşturmak için modern, yüksek performanslı bir web çerçevesi. FastAPI, otomatik veri doğrulama, serileştirme ve dokümantasyon oluşturma sağlar.
- Uvicorn: Asenkron Python uygulamalarını çalıştırmak için bir ASGI sunucusu.
- Requests: Arka uç hizmetlerine HTTP istekleri yapmak için bir kütüphane. Daha karmaşık senaryolar için, asenkron desteği sağlayan `httpx` kullanmayı düşünün.
- PyJWT: Kimlik doğrulama için JSON Web Jetonları (JWT'ler) ile çalışmak için bir kütüphane.
Proje Yapısı
api_gateway/ ├── main.py # Ana uygulama dosyası ├── config.py # Yapılandırma ayarları ├── routes.py # API yönlendirme tanımları ├── auth.py # Kimlik doğrulama mantığı ├── utils.py # Yardımcı fonksiyonlar └── requirements.txt # Proje bağımlılıkları
Örnek Kod: main.py
from fastapi import FastAPI, Depends, HTTPException, Request
from fastapi.responses import JSONResponse
import uvicorn
import requests
import jwt
from config import settings
from auth import verify_jwt
from routes import router
app = FastAPI()
app.include_router(router)
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
response = await call_next(request)
return response
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
Örnek Kod: routes.py
from fastapi import APIRouter, Depends, HTTPException, Request
from fastapi.responses import JSONResponse
import requests
import jwt
from config import settings
from auth import verify_jwt
router = APIRouter()
@router.get("/products/{product_id}")
async def get_product(product_id: int, request: Request, is_authenticated: bool = Depends(verify_jwt)):
# İsteği ürün servisine ilet
product_service_url = f"{settings.product_service_url}/products/{product_id}"
try:
response = requests.get(product_service_url)
response.raise_for_status() # Kötü yanıtlar (4xx veya 5xx) için HTTPError'ı yükselt
return response.json()
except requests.exceptions.RequestException as e:
raise HTTPException(status_code=500, detail=f"Ürün servisiyle iletişimde hata: {e}")
@router.post("/orders")
async def create_order(request: Request, is_authenticated: bool = Depends(verify_jwt)):
# İsteği sipariş servisine ilet
order_service_url = f"{settings.order_service_url}/orders"
body = await request.json()
try:
response = requests.post(order_service_url, json=body)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
raise HTTPException(status_code=500, detail=f"Sipariş servisiyle iletişimde hata: {e}")
Örnek Kod: auth.py
from fastapi import HTTPException, Depends, Header
import jwt
from config import settings
from typing import Optional
async def verify_jwt(authorization: Optional[str] = Header(None)) -> bool:
if not authorization:
raise HTTPException(status_code=401, detail="Yetkilendirme başlığı gerekli")
try:
token = authorization.split(" ")[1]
jwt.decode(token, settings.jwt_secret, algorithms=[settings.jwt_algorithm])
return True
except jwt.ExpiredSignatureError:
raise HTTPException(status_code=401, detail="Jetonun süresi doldu")
except jwt.InvalidTokenError:
raise HTTPException(status_code=401, detail="Geçersiz jeton")
Örnek Kod: config.py
import os
from typing import Optional
from pydantic import BaseSettings
class Settings(BaseSettings):
product_service_url: str = os.getenv("PRODUCT_SERVICE_URL", "http://localhost:8001")
order_service_url: str = os.getenv("ORDER_SERVICE_URL", "http://localhost:8002")
jwt_secret: str = os.getenv("JWT_SECRET", "secret")
jwt_algorithm: str = os.getenv("JWT_ALGORITHM", "HS256")
settings = Settings()
Yapılandırma
Arka uç hizmet URL'leri ve kimlik doğrulama anahtarları gibi yapılandırma ayarlarını ayrı bir yapılandırma dosyasında (örn. `config.py`) saklayın. Farklı ortamları (geliştirme, hazırlık, üretim) yapılandırmak için ortam değişkenlerini kullanın.
Kimlik Doğrulama
JWT'leri kullanarak kimlik doğrulamayı uygulayın. API Ağ Geçidi, isteği arka uç hizmetine iletmeden önce JWT'yi doğrular. Bu yaklaşım güvenliği ve merkeziyetsizliği teşvik eder. Daha büyük kuruluşlar için, Keycloak veya Azure AD gibi bir Kimlik Sağlayıcısı ile entegre olmayı düşünün. Bu, kimlik doğrulama ve yetkilendirme politikalarını merkezileştirebilir.
Yönlendirme
Yolları ayrı bir dosyada (örn. `routes.py`) tanımlayın. Gelen istekleri uygun arka uç hizmetlerine eşlemek için FastAPI'nin yönlendirici işlevini kullanın. İsteğin yoluna, HTTP yöntemine ve başlıklarına göre yönlendirme uygulayın.
Örnek: API Ağ Geçidini Dockerize Etme
API Ağ Geçidini bir kapsayıcıya paketlemek için bir `Dockerfile` oluşturun.
FROM python:3.9-slim-buster WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Hizmet Ağı Entegrasyonu
Python API Ağ Geçidini Istio gibi bir hizmet ağıyla entegre etmek, güvenliği, gözlemlenebilirliği ve trafik yönetimini artırır. Istio'yu API Ağ Geçidi üzerinden akan trafiği yönetecek şekilde nasıl yapılandıracağımıza odaklanacağız.
Istio Kurulumu
Devam etmeden önce, Istio'nun Kubernetes kümenize yüklendiğinden emin olun. Kurulum talimatları için resmi Istio belgelerine bakın. AWS, Google Cloud ve Azure gibi birçok bulut sağlayıcısı, dağıtımı ve yönetimi basitleştiren yönetilen Istio hizmetleri sunar.
Yan Arabası Enjeksiyonu
Istio, bir hizmete giden ve gelen tüm trafiği engellemek için bir yan araba proxy'si (Envoy) kullanır. API Ağ Geçidi için Istio'yu etkinleştirmek için, yan araba proxy'sini API Ağ Geçidinin pod'una enjekte etmeniz gerekir. Bu, genellikle pod dağıtımına bir ek açıklama eklenerek yapılır:
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-gateway
labels:
app: api-gateway
spec:
replicas: 1
selector:
matchLabels:
app: api-gateway
template:
metadata:
labels:
app: api-gateway
annotations:
sidecar.istio.io/inject: "true" # Istio yan araba enjeksiyonunu etkinleştir
spec:
containers:
- name: api-gateway
image: your-api-gateway-image:latest
ports:
- containerPort: 8000
Sanal Hizmetler ve Ağ Geçitleri
Istio, trafik yönlendirmeyi yönetmek için Sanal Hizmetleri ve Ağ Geçitlerini kullanır. Bir Ağ Geçidi, trafiğin ağa giriş noktasını tanımlarken, bir Sanal Hizmet trafiğin ağ içindeki hizmetlere nasıl yönlendirileceğini tanımlar.
Bir Istio Ağ Geçidi Oluşturma
API Ağ Geçidini harici trafiğe açmak için bir Istio Ağ Geçidi tanımlayın.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: api-gateway-gateway
spec:
selector:
istio: ingressgateway # Istio'nun varsayılan giriş ağ geçidini kullan
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*" # Alan adınızla değiştirin
Bir Sanal Hizmet Oluşturma
Trafiği Ağ Geçidinden API Ağ Geçidi hizmetine yönlendirmek için bir Sanal Hizmet tanımlayın.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: api-gateway-virtualservice
spec:
hosts:
- "*" # Alan adınızla değiştirin
gateways:
- api-gateway-gateway
http:
- route:
- destination:
host: api-gateway # Kubernetes'teki hizmet adı
port:
number: 8000 # API Ağ Geçidinin dinlediği bağlantı noktası
Istio ile Trafik Yönetimi
Istio, aşağıdaki gibi güçlü trafik yönetimi yetenekleri sağlar:
- Yük Dengeleme: Bir hizmetin birden çok örneği arasında trafiği dağıtma. Istio, yuvarlak robin, en az bağlantı ve tutarlı karma gibi çeşitli yük dengeleme algoritmalarını destekler.
- Trafik Bölme (Kanarya Dağıtımları): Yeni bir hizmet sürümüne trafiğin küçük bir yüzdesini göndererek yeni hizmet sürümlerini kademeli olarak kullanıma sunma. Bu, tüm kullanıcıları etkilemeden üretimde yeni özellikleri test etmenizi sağlar.
- Devre Kesme: Sağlıksız hizmetlere trafiği otomatik olarak durdurarak basamaklı hataları önleme.
- Hata Enjeksiyonu: Uygulamanızın esnekliğini test etmek için trafiğe gecikmeler veya hatalar enjekte etme.
Örnek: Istio ile Kanarya Dağıtımı
Bir kanarya dağıtımı gerçekleştirmek için, Istio'yu trafiğin küçük bir yüzdesini (örn. %10) API Ağ Geçidinin yeni sürümüne gönderecek şekilde yapılandırabilirsiniz.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: api-gateway-virtualservice
spec:
hosts:
- "*" # Alan adınızla değiştirin
gateways:
- api-gateway-gateway
http:
- route:
- destination:
host: api-gateway # Sürüm 1
port:
number: 8000
weight: 90
- destination:
host: api-gateway-v2 # Sürüm 2 (Kanarya)
port:
number: 8000
weight: 10
Gözlemlenebilirlik
API Ağ Geçidinizin ve arka uç hizmetlerinizin performansını ve sağlığını anlamak için izleme ve günlük kaydı kritik öneme sahiptir. Aşağıdaki gibi araçları kullanarak kapsamlı gözlemlenebilirlik uygulayın:
- Prometheus: Metrikleri toplamak ve depolamak için bir izleme sistemi. Istio, hizmet trafiği, gecikme süresi ve hatalar hakkında metrikler sağlamak için Prometheus ile entegre olur.
- Grafana: Uygulamanızı izlemek için panolar oluşturmaya yönelik bir veri görselleştirme aracı.
- Jaeger: Mikro hizmetlerinizde akarken istekleri izlemek için dağıtılmış bir izleme sistemi. Istio, hizmetten hizmete tüm iletişim için otomatik olarak izler oluşturabilir.
- Fluentd/Elasticsearch/Kibana (EFK Yığını): Günlükleri toplamak, depolamak ve analiz etmek için bir günlük yığını.
Istio Telemetrisi
Istio, hizmet trafiği hakkında metrikler, günlükler ve izler dahil olmak üzere telemetri verilerini otomatik olarak toplar. Bu verileri API Ağ Geçidinizin ve arka uç hizmetlerinizin performansını ve sağlığını izlemek için kullanabilirsiniz. Telemetri verilerini Prometheus, Grafana ve Jaeger'e aktarmak için Istio'yu yapılandırın.
API Ağ Geçidine Özel Metrikler
Istio'nun telemetri verilerine ek olarak, aşağıdaki gibi API Ağ Geçidine özel metrikleri de toplamalısınız:
- İstek Oranı: Saniyedeki istek sayısı.
- Yanıt Süresi: Bir isteği işlemenin ortalama süresi.
- Hata Oranı: Bir hatayla sonuçlanan isteklerin yüzdesi.
- Kimlik Doğrulama Başarı/Başarısızlık Oranı: Başarılı ve başarısız kimlik doğrulama girişimlerinin sayısı.
- Önbellek İsabet Oranı: Önbellekten sunulan isteklerin yüzdesi.
Güvenlik Hususları
Bir API Ağ Geçidi oluştururken güvenlik çok önemlidir. Aşağıdaki güvenlik önlemlerini göz önünde bulundurun:
- Kimlik Doğrulama ve Yetkilendirme: Arka uç hizmetlerinizi korumak için sağlam kimlik doğrulama ve yetkilendirme mekanizmaları uygulayın. JWT'leri, OAuth 2.0'ı veya diğer endüstri standardı protokollerini kullanın.
- Giriş Doğrulaması: Enjeksiyon saldırılarını önlemek için gelen tüm istekleri doğrulayın.
- Hız Sınırlama: Kötüye kullanımı ve hizmet reddi saldırılarını önlemek için hız sınırlaması uygulayın.
- TLS Şifrelemesi: API Ağ Geçidi ve arka uç hizmetleri arasındaki tüm iletişimi TLS kullanarak şifreleyin. Istio, karşılıklı TLS (mTLS) kullanarak otomatik TLS şifrelemesi sağlar.
- Web Uygulama Güvenlik Duvarı (WAF): SQL enjeksiyonu ve siteler arası komut dosyası (XSS) gibi yaygın web uygulaması saldırılarına karşı korunmak için bir WAF kullanın.
- Düzenli Güvenlik Denetimleri: Güvenlik açıklarını belirlemek ve gidermek için düzenli güvenlik denetimleri yapın.
Istio ile Karşılıklı TLS (mTLS)
Istio, tüm hizmetten hizmete iletişim için mTLS'yi otomatik olarak uygulayabilir ve tüm iletişimin şifrelenmesini ve kimliğinin doğrulanmasını sağlar. Bu, dinlemeye ve kurcalamaya karşı güçlü bir güvenlik katmanı sağlar.
Gelişmiş Konular
GraphQL Ağ Geçidi
REST API'leri yerine, daha verimli veri getirme için GraphQL kullanmayı düşünün. Graphene ve Ariadne gibi kütüphaneleri kullanarak bir GraphQL ağ geçidi uygulayın. GraphQL, istemcilerin yalnızca ihtiyaç duydukları verileri talep etmelerine olanak tanır, bu da aşırı getirmeyi azaltır ve performansı artırır.
gRPC Ağ Geçidi
Hizmetler arasında yüksek performanslı iletişim için gRPC kullanmayı düşünün. gRPC hizmetlerini harici istemcilere açmak için bir gRPC ağ geçidi uygulayın. gRPC tanımlarından RESTful API'ler oluşturmak için grpc-gateway gibi araçları kullanın.
Sunucusuz API Ağ Geçidi
API Ağ Geçidinizi AWS Lambda, Google Cloud Functions veya Azure Functions gibi platformları kullanarak sunucusuz bir işlev olarak dağıtın. Sunucusuz API Ağ Geçitleri, ölçeklenebilirlik, maliyet etkinliği ve azaltılmış operasyonel yük sunar. Örneğin, API Ağ Geçidi, istekleri işlemek için Python'da yazılmış AWS Lambda işlevleriyle entegre edilebilir. Bu sunucusuz yaklaşım, altyapı maliyetlerini önemli ölçüde azaltabilir.
Sonuç
Hizmet ağı entegrasyonu ile bir Python API Ağ Geçidi oluşturmak, mikro hizmet iletişimini yönetmek için sağlam ve ölçeklenebilir bir çözüm sağlar. API Ağ Geçitlerinin ve Hizmet Ağlarının güçlü yönlerini birleştirerek, gelişmiş güvenlik, gözlemlenebilirlik ve trafik yönetimi elde edebilirsiniz. Bu mimari, yüksek kullanılabilirlik, ölçeklenebilirlik ve güvenlik gerektiren modern, bulut yerel uygulamaları için çok uygundur. Belirli gereksinimlerinizi göz önünde bulundurmayı ve ihtiyaçlarınıza en uygun araçları ve teknolojileri seçmeyi unutmayın. Örneğin, daha küçük bir şirket, göreli kullanım kolaylığı nedeniyle bir API Ağ Geçidi olarak Kong'u ve bir Hizmet Ağı olarak Linkerd'i tercih edebilirken, daha büyük bir kuruluş, mimarilerinin her yönü üzerinde ince taneli kontrol sahibi olmak için Istio'yu ve özel olarak oluşturulmuş bir Python API Ağ Geçidini tercih edebilir. Doğru araçları seçmek ve yukarıda belirtilen güvenlik hususlarını dikkatli bir şekilde uygulamak başarı için çok önemlidir. Ayrıca, sürekli izleme ve uyum, sürekli gelişen teknolojik ortamda sağlam ve güvenli bir API Ağ Geçidini korumak için çok önemlidir.